library(dplyr)
library(readr)
histologies_df <- read_tsv("../../data/pbta-histologies.tsv")
Parsed with column specification:
cols(
  .default = col_character(),
  OS_days = col_double(),
  age_last_update_days = col_double(),
  normal_fraction = col_double(),
  tumor_fraction = col_double(),
  tumor_ploidy = col_double()
)
See spec(...) for full column specifications.
chordoma_samples <- histologies_df %>%
  filter(short_histology=="Chordoma") %>% 
  pull(Kids_First_Biospecimen_ID)
focal_cn_df <- read_tsv("../focal-cn-file-preparation/results/controlfreec_annotated_cn_autosomes.tsv.bz2")
Parsed with column specification:
cols(
  biospecimen_id = col_character(),
  arm = col_character(),
  broad_status = col_character(),
  status = col_character(),
  copy_number = col_double(),
  ploidy = col_double(),
  ensembl = col_character(),
  gene_symbol = col_character()
)
chordoma_loss <- focal_cn_df %>% 
  filter(biospecimen_id %in% chordoma_samples, gene_symbol=="SMARCB1")

chordoma_loss 
#we need to include the sample_id field from pbta-histologies.tsv in the final table (field will allow #us to map between RNA-seq (e.g., SMARCB1 expression values) and WGS data (e.g., SMARCB1 focal copy #number status) from the same event for a given individual).
#To get the SMARCB1 jitter plot in the photo here #250 (comment), you will first need to read in the #collapsed expression data

expression_data <- read_rds(file.path("..", "..", "data", "pbta-gene-expression-rsem-fpkm-collapsed.stranded.rds"))
expression_data
chordoma_id_df <- histologies_df %>% 
  # only rows with chordoma samples
  filter(short_histology == "Chordoma") %>%
  # select only these columns that we'll need later
  select(Kids_First_Biospecimen_ID, sample_id, Kids_First_Participant_ID,
         experimental_strategy)
chordoma_id_df
copy_neutral_df <- chordoma_id_df %>% 
  # the copy events can only be taken from WGS data not RNA-seq data
  # we also only want biospecimens where a loss was not recorded to avoid duplicates
  filter(experimental_strategy == "WGS",
         !(Kids_First_Biospecimen_ID %in% chordoma_loss$biospecimen_id)) %>%
  # if there's no loss, let's assume status is copy neutral
  mutate(status = "neutral") %>%
  # let's get the columns to match chordoma_loss
  rename(biospecimen_id = Kids_First_Biospecimen_ID) %>%
  select(biospecimen_id, status)
copy_neutral_df
chordoma_copy <- chordoma_loss %>% 
  #join the losses with the neutrals to get a new data frame
  select(biospecimen_id, status) %>%
  bind_rows(copy_neutral_df)
chordoma_copy

Need to get the sample_id that corresponds to biospecimen_id into chordoma_copy so we can match WGS and RNA-seq biospecimens from the same event/sample:

chordoma_copy <- chordoma_copy %>%
  # get only the Kids_First_Biospecimen_ID, sample_id columns from our identifier data.frame
  # then use biospecimen IDs to add the sample_id info
  inner_join(select(chordoma_id_df,
                    Kids_First_Biospecimen_ID,
                    sample_id),
             by = c("biospecimen_id" = "Kids_First_Biospecimen_ID"))
chordoma_copy

look at SMARCB1 expression values only in chordoma

# get the row that contains the SMARCB1 values
# gene symbols are rownames
smarcb1_expression <- expression_data[which(rownames(expression_data) == "SMARCB1"), ]

# now only the columns correspond to chordoma samples
smarcb1_expression <- smarcb1_expression[, which(colnames(expression_data) %in% chordoma_samples) ]
smarcb1_expression

The smarcb1_expression is a not a friendly form ^^; Transposing needed:

# transpose such that samples are rows
smarcb1_expression <- t(smarcb1_expression) %>%
  # make a data.frame
  as.data.frame() %>%
  # we want the rownames that are biospecimen identifers as their own column called Kids_First_Biospecimen_ID
  tibble::rownames_to_column("Kids_First_Biospecimen_ID") %>%
  # give SMARCB1 column a slightly better column name
  rename(SMARCB1_expression = SMARCB1)
smarcb1_expression

This also needs sample_id to add it in:

smarcb1_expression <- smarcb1_expression %>%
  inner_join(select(chordoma_id_df,
                    Kids_First_Biospecimen_ID,
                    sample_id),
             by = "Kids_First_Biospecimen_ID")
smarcb1_expression
chordoma_smarcb1_df <- smarcb1_expression %>%
  # any missing samples will get filled with NA when using a full join
  full_join(chordoma_copy, by = "sample_id")
chordoma_smarcb1_df
# this step adds in the participant identifier (sample_id to match between the two data.frame)
chordoma_smarcb1_df <- chordoma_smarcb1_df %>%
  inner_join(distinct(select(chordoma_id_df, 
                             sample_id, 
                             Kids_First_Participant_ID)),
             by = "sample_id")

# combining the two biospecimen identifiers to a single column (all biospecimen IDs for a sampl separated by a comma)
chordoma_smarcb1_df <- chordoma_smarcb1_df %>%
  mutate(Kids_First_Biospecimen_ID = if_else(
    # one sample is missing WGS data, so if that's true only include biospecimen ID from RNA-seq
    is.na(biospecimen_id),
    Kids_First_Biospecimen_ID,
    paste(Kids_First_Biospecimen_ID, biospecimen_id, sep = ", ")
  ))
chordoma_smarcb1_df
chordoma_smarcb1_df <- chordoma_smarcb1_df %>%
  select(Kids_First_Participant_ID, 
         Kids_First_Biospecimen_ID, 
         sample_id,
         status,
         SMARCB1_expression) %>%
  # 'status' is replaced a more descriptive name
  rename(focal_SMARCB1_status = status)
chordoma_smarcb1_df
library(ggplot2)
# this specifies that this is the data we want to plot
chordoma_smarcb1_df %>%
  # drop the sample that doesn't have WGS data
  tidyr::drop_na() %>%
  # this step specifies what should go on the x- and y-axes
  ggplot(aes(x = focal_SMARCB1_status,
             y = SMARCB1_expression)) +
  # we want a jitter plot where the points aren't too far 
  # apart that's what width does
  geom_jitter(width = 0.1) +
  # this is plotting the median as a blue diamond
  stat_summary(fun.y = "median", 
               geom = "point", 
               size = 3, 
               color = "blue", 
               shape = 18)

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Cmd+Option+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Cmd+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

LS0tCnRpdGxlOiAiU3ViZ3R5cGluZy1jaG9yZG9tYSIKb3V0cHV0OiBodG1sX25vdGVib29rCmF1dGhvcjogTWF0ZXVzeiBLb3B0eXJhIApkYXRlOiAyMDE5MTEyMQotLS0KCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHJlYWRyKQpgYGAKCmBgYHtyfQpoaXN0b2xvZ2llc19kZiA8LSByZWFkX3RzdigiLi4vLi4vZGF0YS9wYnRhLWhpc3RvbG9naWVzLnRzdiIpCmBgYApgYGB7cn0KY2hvcmRvbWFfc2FtcGxlcyA8LSBoaXN0b2xvZ2llc19kZiAlPiUKICBmaWx0ZXIoc2hvcnRfaGlzdG9sb2d5PT0iQ2hvcmRvbWEiKSAlPiUgCiAgcHVsbChLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lEKQpgYGAKCmBgYHtyfQpmb2NhbF9jbl9kZiA8LSByZWFkX3RzdigiLi4vZm9jYWwtY24tZmlsZS1wcmVwYXJhdGlvbi9yZXN1bHRzL2NvbnRyb2xmcmVlY19hbm5vdGF0ZWRfY25fYXV0b3NvbWVzLnRzdi5iejIiKQpgYGAKCmBgYHtyfQpjaG9yZG9tYV9sb3NzIDwtIGZvY2FsX2NuX2RmICU+JSAKICBmaWx0ZXIoYmlvc3BlY2ltZW5faWQgJWluJSBjaG9yZG9tYV9zYW1wbGVzLCBnZW5lX3N5bWJvbD09IlNNQVJDQjEiKQoKY2hvcmRvbWFfbG9zcyAKYGBgCgpgYGB7cn0KI3dlIG5lZWQgdG8gaW5jbHVkZSB0aGUgc2FtcGxlX2lkIGZpZWxkIGZyb20gcGJ0YS1oaXN0b2xvZ2llcy50c3YgaW4gdGhlIGZpbmFsIHRhYmxlIChmaWVsZCB3aWxsIGFsbG93ICN1cyB0byBtYXAgYmV0d2VlbiBSTkEtc2VxIChlLmcuLCBTTUFSQ0IxIGV4cHJlc3Npb24gdmFsdWVzKSBhbmQgV0dTIGRhdGEgKGUuZy4sIFNNQVJDQjEgZm9jYWwgY29weSAjbnVtYmVyIHN0YXR1cykgZnJvbSB0aGUgc2FtZSBldmVudCBmb3IgYSBnaXZlbiBpbmRpdmlkdWFsKS4KI1RvIGdldCB0aGUgU01BUkNCMSBqaXR0ZXIgcGxvdCBpbiB0aGUgcGhvdG8gaGVyZSAjMjUwIChjb21tZW50KSwgeW91IHdpbGwgZmlyc3QgbmVlZCB0byByZWFkIGluIHRoZSAjY29sbGFwc2VkIGV4cHJlc3Npb24gZGF0YQoKZXhwcmVzc2lvbl9kYXRhIDwtIHJlYWRfcmRzKGZpbGUucGF0aCgiLi4iLCAiLi4iLCAiZGF0YSIsICJwYnRhLWdlbmUtZXhwcmVzc2lvbi1yc2VtLWZwa20tY29sbGFwc2VkLnN0cmFuZGVkLnJkcyIpKQpleHByZXNzaW9uX2RhdGEKYGBgCgpgYGB7cn0KY2hvcmRvbWFfaWRfZGYgPC0gaGlzdG9sb2dpZXNfZGYgJT4lIAogICMgb25seSByb3dzIHdpdGggY2hvcmRvbWEgc2FtcGxlcwogIGZpbHRlcihzaG9ydF9oaXN0b2xvZ3kgPT0gIkNob3Jkb21hIikgJT4lCiAgIyBzZWxlY3Qgb25seSB0aGVzZSBjb2x1bW5zIHRoYXQgd2UnbGwgbmVlZCBsYXRlcgogIHNlbGVjdChLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lELCBzYW1wbGVfaWQsIEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQsCiAgICAgICAgIGV4cGVyaW1lbnRhbF9zdHJhdGVneSkKY2hvcmRvbWFfaWRfZGYKYGBgCgpgYGB7cn0KY29weV9uZXV0cmFsX2RmIDwtIGNob3Jkb21hX2lkX2RmICU+JSAKICAjIHRoZSBjb3B5IGV2ZW50cyBjYW4gb25seSBiZSB0YWtlbiBmcm9tIFdHUyBkYXRhIG5vdCBSTkEtc2VxIGRhdGEKICAjIHdlIGFsc28gb25seSB3YW50IGJpb3NwZWNpbWVucyB3aGVyZSBhIGxvc3Mgd2FzIG5vdCByZWNvcmRlZCB0byBhdm9pZCBkdXBsaWNhdGVzCiAgZmlsdGVyKGV4cGVyaW1lbnRhbF9zdHJhdGVneSA9PSAiV0dTIiwKICAgICAgICAgIShLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lEICVpbiUgY2hvcmRvbWFfbG9zcyRiaW9zcGVjaW1lbl9pZCkpICU+JQogICMgaWYgdGhlcmUncyBubyBsb3NzLCBsZXQncyBhc3N1bWUgc3RhdHVzIGlzIGNvcHkgbmV1dHJhbAogIG11dGF0ZShzdGF0dXMgPSAibmV1dHJhbCIpICU+JQogICMgbGV0J3MgZ2V0IHRoZSBjb2x1bW5zIHRvIG1hdGNoIGNob3Jkb21hX2xvc3MKICByZW5hbWUoYmlvc3BlY2ltZW5faWQgPSBLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lEKSAlPiUKICBzZWxlY3QoYmlvc3BlY2ltZW5faWQsIHN0YXR1cykKY29weV9uZXV0cmFsX2RmCmBgYAoKYGBge3J9CmNob3Jkb21hX2NvcHkgPC0gY2hvcmRvbWFfbG9zcyAlPiUgCiAgI2pvaW4gdGhlIGxvc3NlcyB3aXRoIHRoZSBuZXV0cmFscyB0byBnZXQgYSBuZXcgZGF0YSBmcmFtZQogIHNlbGVjdChiaW9zcGVjaW1lbl9pZCwgc3RhdHVzKSAlPiUKICBiaW5kX3Jvd3MoY29weV9uZXV0cmFsX2RmKQpjaG9yZG9tYV9jb3B5CmBgYApOZWVkIHRvIGdldCB0aGUgc2FtcGxlX2lkIHRoYXQgY29ycmVzcG9uZHMgdG8gYmlvc3BlY2ltZW5faWQgaW50byBjaG9yZG9tYV9jb3B5IHNvIHdlIGNhbiBtYXRjaCBXR1MgYW5kIFJOQS1zZXEgYmlvc3BlY2ltZW5zIGZyb20gdGhlIHNhbWUgZXZlbnQvc2FtcGxlOgpgYGB7cn0KY2hvcmRvbWFfY29weSA8LSBjaG9yZG9tYV9jb3B5ICU+JQogICMgZ2V0IG9ubHkgdGhlIEtpZHNfRmlyc3RfQmlvc3BlY2ltZW5fSUQsIHNhbXBsZV9pZCBjb2x1bW5zIGZyb20gb3VyIGlkZW50aWZpZXIgZGF0YS5mcmFtZQogICMgdGhlbiB1c2UgYmlvc3BlY2ltZW4gSURzIHRvIGFkZCB0aGUgc2FtcGxlX2lkIGluZm8KICBpbm5lcl9qb2luKHNlbGVjdChjaG9yZG9tYV9pZF9kZiwKICAgICAgICAgICAgICAgICAgICBLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lELAogICAgICAgICAgICAgICAgICAgIHNhbXBsZV9pZCksCiAgICAgICAgICAgICBieSA9IGMoImJpb3NwZWNpbWVuX2lkIiA9ICJLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lEIikpCmNob3Jkb21hX2NvcHkKYGBgCmxvb2sgYXQgU01BUkNCMSBleHByZXNzaW9uIHZhbHVlcyBvbmx5IGluIGNob3Jkb21hCgpgYGB7cn0KIyBnZXQgdGhlIHJvdyB0aGF0IGNvbnRhaW5zIHRoZSBTTUFSQ0IxIHZhbHVlcwojIGdlbmUgc3ltYm9scyBhcmUgcm93bmFtZXMKc21hcmNiMV9leHByZXNzaW9uIDwtIGV4cHJlc3Npb25fZGF0YVt3aGljaChyb3duYW1lcyhleHByZXNzaW9uX2RhdGEpID09ICJTTUFSQ0IxIiksIF0KCiMgbm93IG9ubHkgdGhlIGNvbHVtbnMgY29ycmVzcG9uZCB0byBjaG9yZG9tYSBzYW1wbGVzCnNtYXJjYjFfZXhwcmVzc2lvbiA8LSBzbWFyY2IxX2V4cHJlc3Npb25bLCB3aGljaChjb2xuYW1lcyhleHByZXNzaW9uX2RhdGEpICVpbiUgY2hvcmRvbWFfc2FtcGxlcykgXQpzbWFyY2IxX2V4cHJlc3Npb24KYGBgCgpUaGUgc21hcmNiMV9leHByZXNzaW9uIGlzIGEgbm90IGEgZnJpZW5kbHkgZm9ybSBeXjsgVHJhbnNwb3NpbmcgbmVlZGVkOiAKYGBge3J9CiMgdHJhbnNwb3NlIHN1Y2ggdGhhdCBzYW1wbGVzIGFyZSByb3dzCnNtYXJjYjFfZXhwcmVzc2lvbiA8LSB0KHNtYXJjYjFfZXhwcmVzc2lvbikgJT4lCiAgIyBtYWtlIGEgZGF0YS5mcmFtZQogIGFzLmRhdGEuZnJhbWUoKSAlPiUKICAjIHdlIHdhbnQgdGhlIHJvd25hbWVzIHRoYXQgYXJlIGJpb3NwZWNpbWVuIGlkZW50aWZlcnMgYXMgdGhlaXIgb3duIGNvbHVtbiBjYWxsZWQgS2lkc19GaXJzdF9CaW9zcGVjaW1lbl9JRAogIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKCJLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lEIikgJT4lCiAgIyBnaXZlIFNNQVJDQjEgY29sdW1uIGEgc2xpZ2h0bHkgYmV0dGVyIGNvbHVtbiBuYW1lCiAgcmVuYW1lKFNNQVJDQjFfZXhwcmVzc2lvbiA9IFNNQVJDQjEpCnNtYXJjYjFfZXhwcmVzc2lvbgpgYGAKVGhpcyBhbHNvIG5lZWRzIHNhbXBsZV9pZCB0byBhZGQgaXQgaW46CmBgYHtyfQpzbWFyY2IxX2V4cHJlc3Npb24gPC0gc21hcmNiMV9leHByZXNzaW9uICU+JQogIGlubmVyX2pvaW4oc2VsZWN0KGNob3Jkb21hX2lkX2RmLAogICAgICAgICAgICAgICAgICAgIEtpZHNfRmlyc3RfQmlvc3BlY2ltZW5fSUQsCiAgICAgICAgICAgICAgICAgICAgc2FtcGxlX2lkKSwKICAgICAgICAgICAgIGJ5ID0gIktpZHNfRmlyc3RfQmlvc3BlY2ltZW5fSUQiKQpzbWFyY2IxX2V4cHJlc3Npb24KYGBgCmBgYHtyfQpjaG9yZG9tYV9zbWFyY2IxX2RmIDwtIHNtYXJjYjFfZXhwcmVzc2lvbiAlPiUKICAjIGFueSBtaXNzaW5nIHNhbXBsZXMgd2lsbCBnZXQgZmlsbGVkIHdpdGggTkEgd2hlbiB1c2luZyBhIGZ1bGwgam9pbgogIGZ1bGxfam9pbihjaG9yZG9tYV9jb3B5LCBieSA9ICJzYW1wbGVfaWQiKQpjaG9yZG9tYV9zbWFyY2IxX2RmCmBgYAoKYGBge3J9CiMgdGhpcyBzdGVwIGFkZHMgaW4gdGhlIHBhcnRpY2lwYW50IGlkZW50aWZpZXIgKHNhbXBsZV9pZCB0byBtYXRjaCBiZXR3ZWVuIHRoZSB0d28gZGF0YS5mcmFtZSkKY2hvcmRvbWFfc21hcmNiMV9kZiA8LSBjaG9yZG9tYV9zbWFyY2IxX2RmICU+JQogIGlubmVyX2pvaW4oZGlzdGluY3Qoc2VsZWN0KGNob3Jkb21hX2lkX2RmLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVfaWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQpKSwKICAgICAgICAgICAgIGJ5ID0gInNhbXBsZV9pZCIpCgojIGNvbWJpbmluZyB0aGUgdHdvIGJpb3NwZWNpbWVuIGlkZW50aWZpZXJzIHRvIGEgc2luZ2xlIGNvbHVtbiAoYWxsIGJpb3NwZWNpbWVuIElEcyBmb3IgYSBzYW1wbCBzZXBhcmF0ZWQgYnkgYSBjb21tYSkKY2hvcmRvbWFfc21hcmNiMV9kZiA8LSBjaG9yZG9tYV9zbWFyY2IxX2RmICU+JQogIG11dGF0ZShLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lEID0gaWZfZWxzZSgKICAgICMgb25lIHNhbXBsZSBpcyBtaXNzaW5nIFdHUyBkYXRhLCBzbyBpZiB0aGF0J3MgdHJ1ZSBvbmx5IGluY2x1ZGUgYmlvc3BlY2ltZW4gSUQgZnJvbSBSTkEtc2VxCiAgICBpcy5uYShiaW9zcGVjaW1lbl9pZCksCiAgICBLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lELAogICAgcGFzdGUoS2lkc19GaXJzdF9CaW9zcGVjaW1lbl9JRCwgYmlvc3BlY2ltZW5faWQsIHNlcCA9ICIsICIpCiAgKSkKY2hvcmRvbWFfc21hcmNiMV9kZgpgYGAKCmBgYHtyfQpjaG9yZG9tYV9zbWFyY2IxX2RmIDwtIGNob3Jkb21hX3NtYXJjYjFfZGYgJT4lCiAgc2VsZWN0KEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQsIAogICAgICAgICBLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lELCAKICAgICAgICAgc2FtcGxlX2lkLAogICAgICAgICBzdGF0dXMsCiAgICAgICAgIFNNQVJDQjFfZXhwcmVzc2lvbikgJT4lCiAgIyAnc3RhdHVzJyBpcyByZXBsYWNlZCBhIG1vcmUgZGVzY3JpcHRpdmUgbmFtZQogIHJlbmFtZShmb2NhbF9TTUFSQ0IxX3N0YXR1cyA9IHN0YXR1cykKY2hvcmRvbWFfc21hcmNiMV9kZgpgYGAKCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmBgYAoKYGBge3J9CiMgdGhpcyBzcGVjaWZpZXMgdGhhdCB0aGlzIGlzIHRoZSBkYXRhIHdlIHdhbnQgdG8gcGxvdApjaG9yZG9tYV9zbWFyY2IxX2RmICU+JQogICMgZHJvcCB0aGUgc2FtcGxlIHRoYXQgZG9lc24ndCBoYXZlIFdHUyBkYXRhCiAgdGlkeXI6OmRyb3BfbmEoKSAlPiUKICAjIHRoaXMgc3RlcCBzcGVjaWZpZXMgd2hhdCBzaG91bGQgZ28gb24gdGhlIHgtIGFuZCB5LWF4ZXMKICBnZ3Bsb3QoYWVzKHggPSBmb2NhbF9TTUFSQ0IxX3N0YXR1cywKICAgICAgICAgICAgIHkgPSBTTUFSQ0IxX2V4cHJlc3Npb24pKSArCiAgIyB3ZSB3YW50IGEgaml0dGVyIHBsb3Qgd2hlcmUgdGhlIHBvaW50cyBhcmVuJ3QgdG9vIGZhciAKICAjIGFwYXJ0IHRoYXQncyB3aGF0IHdpZHRoIGRvZXMKICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMSkgKwogICMgdGhpcyBpcyBwbG90dGluZyB0aGUgbWVkaWFuIGFzIGEgYmx1ZSBkaWFtb25kCiAgc3RhdF9zdW1tYXJ5KGZ1bi55ID0gIm1lZGlhbiIsIAogICAgICAgICAgICAgICBnZW9tID0gInBvaW50IiwgCiAgICAgICAgICAgICAgIHNpemUgPSAzLCAKICAgICAgICAgICAgICAgY29sb3IgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICBzaGFwZSA9IDE4KQpgYGAKCkFkZCBhIG5ldyBjaHVuayBieSBjbGlja2luZyB0aGUgKkluc2VydCBDaHVuayogYnV0dG9uIG9uIHRoZSB0b29sYmFyIG9yIGJ5IHByZXNzaW5nICpDbWQrT3B0aW9uK0kqLgoKV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDbWQrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4gCgpUaGUgcHJldmlldyBzaG93cyB5b3UgYSByZW5kZXJlZCBIVE1MIGNvcHkgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBlZGl0b3IuIENvbnNlcXVlbnRseSwgdW5saWtlICpLbml0KiwgKlByZXZpZXcqIGRvZXMgbm90IHJ1biBhbnkgUiBjb2RlIGNodW5rcy4gSW5zdGVhZCwgdGhlIG91dHB1dCBvZiB0aGUgY2h1bmsgd2hlbiBpdCB3YXMgbGFzdCBydW4gaW4gdGhlIGVkaXRvciBpcyBkaXNwbGF5ZWQuCgo=